package com.kitty.game.equip.handler;

import com.kitty.game.role.model.Role;
import com.kitty.game.equip.model.RoleEquip;
import com.kitty.game.equip.model.RoleEquipField;
import com.kitty.game.config.Equip;
import com.kitty.common.utils.SpringUtils;
import com.kitty.game.bag.message.RespIconCartoon;
import com.kitty.game.enter.FiedValue;
import com.kitty.game.onlinemall.service.MallService;
import com.kitty.mina.message.MessagePusher;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.text.MessageFormat;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;

import static com.kitty.game.utils.Const.MONEY_NAME;
import static com.kitty.game.utils.Const.ROLE_RESOURCE_NOT_ENOUGH;
import static com.kitty.game.utils.NotifyModules.NOTIFY_EQUIP_REFORM_OK;

/**
 * 装备重组
 */
@Component("EquipReform")
@Slf4j
public class EquipReformHandler extends UpgradeHandler {

    private static final String NO_RIGHT_RESOURCE = "请放入正确的超级黑水晶。";
    private static final String LEVEL_DIFFERENT = "超级黑水晶的等级信息不一致，不能合成。";
    private static final String POS_DIFFERENT = "超级黑水晶上携带的附加属性的种类不一致，不能合成。";
    private static final String NOT_AMOUNT = "重组装备必须使用#R3#n块黑水晶。";
    private static final String SUCCESS = "恭喜你，#R{0}#n的属性重组成功了。";


    @Override
    public String doUpgrade(Role role, Object... params) {
        short newPos = (short) params[0];
        Equip equip = (Equip) params[1];
        RoleEquipField blueField = (RoleEquipField) params[2];
        roleService.subtractMoney(role,needCash(equip.getReq_level(),0));
        RoleEquip roleEquip = new RoleEquip();
        int id = SpringUtils.getBean(MallService.class).getRoleEquipId();
        roleEquip.setId(id);
        roleEquip.setName(equip.getKey_name());
        roleEquip.setRoleId(role.getRoleId());
        roleEquip.setPosition(newPos);
        roleEquip.setFields(new LinkedHashMap<>());
        RoleEquipField roleEquipField = new RoleEquipField();
        roleEquipField.setType((short) 1);
        roleEquipField.setField(new LinkedHashMap<>());
        roleEquip.getFields().put(roleEquipField.getType(), roleEquipField);
        LinkedHashMap<Short, FiedValue> linkedHashMap = equipService.getBasicAttrNew(equip, roleEquip, "蓝色", true);
        roleEquipField.setField(linkedHashMap);
        RoleEquipField basicAtt = equipService.getBasicAttNew(equip);
        roleEquip.getFields().put(basicAtt.getType(), basicAtt);
        roleEquip.getFields().put(blueField.getType(), blueField);
        roleEquip.setType("装备");
        /**计算完美度*/
        equipService.countPerfect(roleEquip);
        /**成功动画*/
        pushOperateResult(role,UPGRADE_SUCCESS);
        /**添加装备*/
        equipService.add(role, roleEquip);
        /**发送物品封包*/
        refreshRoleEquip(role, roleEquip);

        /**获得装备动画*/
        RespIconCartoon respIconCartoon = new RespIconCartoon();
        respIconCartoon.setName(roleEquip.getName());
        respIconCartoon.setParam(roleEquip.getId() + "");
        MessagePusher.pushMessage(role, respIconCartoon);

        return MessageFormat.format(SUCCESS, roleEquip.getName());
    }

    @Override
    public String acceptUpgrade(Role role, int upgradePos, String param) {
        /**判断背包有没有空位*/
        short newPos = getVacancy(role);
        if (newPos <= 0) {
            return ROLE_VACANCY_NOT_ENOUGH;
        }
        /**找不到配置*/
        Equip equip = equipService.getEquipByIcon((short) upgradePos);
        if (equip == null) {
            log.error("找不到装备配置ICON=[{}]", upgradePos);
            return MessageFormat.format(NOT_FIND_CONFIG, upgradePos);
        }
        /**判断传入的黑水晶数量*/
        List<String> posArr = Arrays.asList(param.split("\\|"));
        if (posArr.size() != 3) {
            return NOT_AMOUNT;
        }
        String content = checkResource(role, equip, posArr);
        if (content != null) {
            return content;
        }
        RoleEquipField blueField = getBlueField(role, posArr);

        return doUpgrade(role, newPos, equip, blueField);
    }

    @Override
    @SuppressWarnings("unchecked")
    public String checkResource(Object... objects) {
        Role role = (Role) objects[0];
        Equip equip = (Equip) objects[1];
        List<String> posArr = (List<String>) objects[2];
        /**判断金钱是否足够*/
        if (equip.getReq_level() >= 70) {
            if (role.getMoney() < needCash(equip.getReq_level(),0)) {
                return MessageFormat.format(ROLE_RESOURCE_NOT_ENOUGH, MONEY_NAME);
            }
        }

        /**判断黑水晶的属性对不对*/
        for (String pos : posArr) {
            RoleEquip roleEquip = equipService.getRoleEquipByPos(role, Integer.parseInt(pos));
            if (roleEquip == null) {
                return NO_RIGHT_RESOURCE;
            } else if (!roleEquip.getName().contains(HEISHUIJING)) {
                return NO_RIGHT_RESOURCE;
            } else if (equip.getPosition() != roleEquip.queryEquipPos(true)) {
                return POS_DIFFERENT;
            } else if (equip.getReq_level() != roleEquip.queryLevel()) {
                return LEVEL_DIFFERENT;
            }
            RoleEquipField field = roleEquip.getFields().get((short) 514);
            if (field == null || field.getField().size() > 1) {//黑水晶异常
                return NO_RIGHT_RESOURCE;
            }
        }
        return null;
    }

    private RoleEquipField getBlueField(Role role, List<String> posArr) {
        RoleEquipField blueField = new RoleEquipField();
        blueField.setType((short) 514);
        blueField.setField(new LinkedHashMap<>());
        for (String pos : posArr) {
            RoleEquip roleEquip = equipService.getRoleEquipByPos(role, Integer.parseInt(pos));
            RoleEquipField field = roleEquip.getFields().get((short) 514);
            field.getField().entrySet().stream().findFirst().ifPresent(entry -> blueField.getField().put(entry.getKey(), entry.getValue()));
            //删除黑水晶
            equipService.delRoleEquip(roleEquip, role);
        }
        return blueField;
    }


    @Override
    public int needCash(short level,int pos) {
        return level < 70 ? 0 : 75000 + (level - 70) * 1000;
    }

    @Override
    public String getUpdateTypeStr() {
        return "equip_reform";
    }

    @Override
    int getNotifyType(){
        return NOTIFY_EQUIP_REFORM_OK;
    }
}
